home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP20 / PUBMEM.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-01  |  3.7 KB  |  148 lines

  1. /*-------------------------------------------------
  2.    PUBMEM.CPP -- Define a public imalloc component
  3.                  (c) Paul Yao, 1996
  4.   -------------------------------------------------*/
  5. #include <windows.h>
  6. #include "pubmem.h"
  7.  
  8. extern int cObject ;
  9.  
  10. //-------------------------------------------------------------------
  11. // CreateAllocator -- Exported function to create allocator
  12. //-------------------------------------------------------------------
  13. EXPORT LPMALLOC CreateAllocator ()
  14.      {
  15.      DAlloc *pAllocator = NULL ;
  16.  
  17.      pAllocator = new DAlloc () ;
  18.      if (pAllocator != NULL && pAllocator->Initialize ())
  19.           {
  20.           pAllocator->AddRef () ;
  21.           }
  22.      else
  23.           {
  24.           delete pAllocator ;
  25.           }
  26.  
  27.      return (LPMALLOC) pAllocator ;
  28.      }
  29.  
  30. //-------------------------------------------------------------------
  31. DAlloc::DAlloc ()
  32.      {
  33.      RefCount = 0 ;
  34.      hHeap = NULL ;
  35.      }
  36.  
  37. //-------------------------------------------------------------------
  38. DAlloc::~DAlloc ()
  39.      {
  40.      if (hHeap)
  41.           HeapDestroy (hHeap) ;
  42.      }
  43.  
  44. //-------------------------------------------------------------------
  45. BOOL DAlloc::Initialize ()
  46.      {
  47.      hHeap = HeapCreate (0, 4096, 65535) ;
  48.      return (BOOL) hHeap ;
  49.      }
  50.  
  51. //-------------------------------------------------------------------
  52. STDMETHODIMP
  53. DAlloc::QueryInterface (REFIID riid, LPVOID FAR *ppvObject)
  54.      {
  55.      // Always initialize "out" parameters to NULL
  56.      *ppvObject = NULL ;
  57.  
  58.      // Everyone supports IUnknown
  59.      if (riid == IID_IUnknown)
  60.           *ppvObject = (LPUNKNOWN) this ;
  61.  
  62.      // We support IMalloc
  63.      if (riid == IID_IMalloc)
  64.           *ppvObject = (LPMALLOC) this ;
  65.  
  66.      if (*ppvObject == NULL)
  67.           {
  68.           // Interface not supported
  69.           return E_NOINTERFACE ;
  70.           }
  71.      else
  72.           {
  73.           // Interface supported, so increment reference count
  74.           ((LPUNKNOWN) *ppvObject)->AddRef () ;
  75.           return S_OK ;
  76.           }
  77.      }
  78.  
  79. //-------------------------------------------------------------------
  80. STDMETHODIMP_ (ULONG)
  81. DAlloc::AddRef (void)
  82.      {
  83.      return ++RefCount ;
  84.      }
  85.  
  86. //-------------------------------------------------------------------
  87. STDMETHODIMP_ (ULONG)
  88. DAlloc::Release (void)
  89.      {
  90.      if (0L != --RefCount)
  91.           return RefCount ;
  92.  
  93.      --cObject ;
  94.      delete this ;
  95.      return 0L ;
  96.      }
  97.  
  98. //-------------------------------------------------------------------
  99. STDMETHODIMP_ (void *)
  100. DAlloc::Alloc (ULONG cb)
  101.      {
  102.      return HeapAlloc (hHeap, HEAP_ZERO_MEMORY, cb) ;
  103.      }
  104.  
  105. //-------------------------------------------------------------------
  106. STDMETHODIMP_ (void *)
  107. DAlloc::Realloc (void *pv, ULONG cb)
  108.      {
  109.      return HeapReAlloc (hHeap, HEAP_ZERO_MEMORY, pv, cb) ;
  110.      }
  111.  
  112. //-------------------------------------------------------------------
  113. STDMETHODIMP_ (void)
  114. DAlloc::Free (void *pv)
  115.      {
  116.      HeapFree (hHeap, 0, pv) ;
  117.      }
  118.  
  119. //-------------------------------------------------------------------
  120. STDMETHODIMP_ (ULONG)
  121. DAlloc::GetSize (void *pv)
  122.      {
  123.      return HeapSize (hHeap, 0, pv) ;
  124.      }
  125.  
  126. //-------------------------------------------------------------------
  127. STDMETHODIMP_ (int)
  128. DAlloc::DidAlloc (void *pv)
  129.      {
  130.      PROCESS_HEAP_ENTRY phe ;
  131.      ZeroMemory (&phe, sizeof (PROCESS_HEAP_ENTRY)) ;
  132.  
  133.      while (HeapWalk (hHeap, &phe))
  134.           {
  135.           if (phe.lpData == pv)
  136.                return 1 ;
  137.           }
  138.  
  139.      return 0 ;
  140.      }
  141.  
  142. //-------------------------------------------------------------------
  143. STDMETHODIMP_ (void)
  144. DAlloc::HeapMinimize (void)
  145.      {
  146.      HeapCompact (hHeap, 0) ;
  147.      }
  148.